package br.com.sovi.resources.cerca;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.openinsula.vulcano.core.command.invoker.CommandInvoker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.com.sovi.persistence.Cerca;
import br.com.sovi.persistence.Dispositivo;
import br.com.sovi.persistence.Ponto;
import br.com.sovi.resources.ponto.PontoVO;

@Component
@Path("/cerca")
@Produces(MediaType.APPLICATION_JSON)
public class CercaResource {
	
	private static Log logger = LogFactory.getLog(CercaResource.class);

	@Autowired
	private CommandInvoker commandInvoker;

	@GET
	@Path("/allFromEmpresa")
	public List<CercaVO> allByEmpresa() {
		// logger.debug("Capturando todos os dispositivos.");

		// TODO capturar e filtrar a empresa
		List<Dispositivo> dispostivos = commandInvoker.invoke(new GetDispositivoByEmpresaInitCercaCommand(null));

		List<CercaVO> vos = new ArrayList<CercaVO>();

		for (Dispositivo dispositivo : dispostivos) {
			Cerca cerca = dispositivo.getCerca();
			vos.add(new CercaVO(cerca));
		}

		return vos;
	}

	@GET
	@Path("/getPontosFromCerca")
	public List<PontoVO> getPontosFromCerca(@QueryParam("serial") String serial) {
		List<Ponto> pontos = commandInvoker.invoke(new GetPontosByCerca(serial));

		if (pontos == null) {
			return new ArrayList<PontoVO>();
		}
		
		List<PontoVO> vos = new ArrayList<PontoVO>(pontos.size());

		for (Ponto ponto : pontos) {
			vos.add(new PontoVO(ponto));
		}

		return vos;
	}

	@POST
	@Path("/persist")
	@Consumes(MediaType.APPLICATION_JSON)
	public JSONObject persistCerca(CercaVO cercaVO) throws JSONException {
		try {
			commandInvoker.invoke(new PersistCercaCommand(cercaVO));
			return new JSONObject().append("success", "A cerca foi cadastrada com sucesso.");
		}
		catch (Throwable e) {
			return new JSONObject().append("failed", e.getMessage());
		}
	}

	@POST
	@Path("/delete")
	@Consumes(MediaType.APPLICATION_JSON)
	public JSONObject deleteCerca(String serial) throws JSONException {
		try {
			commandInvoker.invoke(new DeleteCercaCommand(serial));
			return new JSONObject().append("success", Boolean.TRUE);
		}
		catch (Throwable e) {
			logger.error("Erro ao excluir cerca.", e);
			return new JSONObject().append("failed", "").append("exception", e.getMessage());
		}
	}

}
